#include "Socket.h"

#include <unistd.h>
#include <cstring>

Socket::~Socket() {
    close(sockfd_);
}

void Socket::bindAddress(const InetAddress &addr) {
    if(bind(sockfd_, addr.getSockAddr(),  static_cast<socklen_t>(sizeof(struct sockaddr_in6))) == -1){
        // 表示构建失败, 这里也会上传
        fprintf(stderr, "bind error : %s\n", strerror(errno));
        close(sockfd_);
        // 这里记得要先释放服务器的sock资源
        exit(1);
        // 设置服务器异常结束
    }
}

void Socket::listen() {
    if(::listen(sockfd_, 128) == -1) {
        fprintf(stderr, "listen error : %s\n", strerror(errno));
        // 监听sock上的信息, 后面的128就是允许同时接收的数量
        close(sockfd_);
        // 这里记得要先释放服务器的sock资源
        exit(1);
        // 设置服务器异常结束
    }
}

int Socket::accept(InetAddress * peeraddr) {
    struct sockaddr_in client;

    socklen_t len = sizeof client;
    int clientSock = ::accept(sockfd_, (struct sockaddr *) & client, & len);
    if (clientSock == -1){
        // 连接失败, 不调用方法了
        fprintf(stderr, "accept error %s\n", strerror(errno));
        return -1;
    }
    peeraddr = new InetAddress(client);
    return clientSock;
}
